package com.huaxin.hxjwt.common;

import com.huaxin.hxjwt.entity.JwtModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.http.HttpServletRequest;

import java.util.Objects;

/**
 * 从 HTTP 请求 Header 中提取由网关 (api-gateway) 下发的 JWT 用户信息的工具类。
 * 与 JwtUtils 配合使用，共同构成 JWT 相关的工具集。
 */
public class JwtHeaderUtils {

    private static final Logger log = LoggerFactory.getLogger(JwtHeaderUtils.class);

    // ✅ 与网关中定义的 Header 名称保持一致
    private static final String HEADER_OPEN_ID = "X-Authenticated-Open-Id";
    private static final String HEADER_USER_ID = "X-Authenticated-User-Id";
    private static final String HEADER_USER_TYPE = "X-Authenticated-User-Type";
    private static final String HEADER_ORG_ID = "X-Authenticated-Org-Id";
    private static final String HEADER_FAMILY_ID = "X-Authenticated-Family-Id";

    /**
     * 从请求中获取 openId
     *
     * @param request HttpServletRequest
     * @return openId, 如果 Header 不存在或为空，则返回 null
     */
    public static String getOpenId(HttpServletRequest request) {
        return getHeader(request, HEADER_OPEN_ID);
    }

    /**
     * 从请求中获取 userId
     *
     * @param request HttpServletRequest
     * @return userId, 如果 Header 不存在或为空，则返回 null
     */
    public static String getUserId(HttpServletRequest request) {
        return getHeader(request, HEADER_USER_ID);
    }

    /**
     * 从请求中获取 userType
     *
     * @param request HttpServletRequest
     * @return userType, 如果 Header 不存在、为空或无法解析为 Integer，则返回 null
     */
    public static Integer getUserType(HttpServletRequest request) {
        String value = getHeader(request, HEADER_USER_TYPE);
        if (value != null) {
            try {
                return Integer.valueOf(value);
            } catch (NumberFormatException e) {
                log.warn("Header '{}' 的值 '{}' 无法解析为 Integer", HEADER_USER_TYPE, value);
            }
        }
        return null;
    }

    /**
     * 从请求中获取 orgId
     *
     * @param request HttpServletRequest
     * @return orgId, 如果 Header 不存在或为空，则返回 null
     */
    public static String getOrgId(HttpServletRequest request) {
        return getHeader(request, HEADER_ORG_ID);
    }

    /**
     * 从请求中获取 familyId
     *
     * @param request HttpServletRequest
     * @return familyId, 如果 Header 不存在或为空，则返回 null
     */
    public static String getFamilyId(HttpServletRequest request) {
        return getHeader(request, HEADER_FAMILY_ID);
    }

    /**
     * 从请求中获取完整的 JwtModel 对象
     *
     * @param request HttpServletRequest
     * @return JwtModel, 包含所有从 Header 解析出的信息。如果任何必需字段为空，该字段在 JwtModel 中也为 null。
     */
    public static JwtModel getJwtModelFromHeader(HttpServletRequest request) {
        JwtModel model = new JwtModel();
        model.setOpenId(getOpenId(request));
        model.setUserId(getUserId(request));
        model.setUserType(getUserType(request));
        model.setOrgId(getOrgId(request));
        model.setFamilyId(getFamilyId(request));
        return model;
    }

    // ----------------------- 私有辅助方法 -----------------------

    /**
     * 获取指定 Header 的值，去除首尾空格，并处理 null 和空字符串
     */
    private static String getHeader(HttpServletRequest request, String headerName) {
        String value = request.getHeader(headerName);
        if (value != null) {
            value = value.trim();
            return value.isEmpty() ? null : value;
        }
        return null;
    }

    /**
     * 检查当前请求是否包含有效的认证信息。
     * 根据业务需求，这里仅要求 userId 必须存在且非空。
     *
     * @param request HttpServletRequest
     * @return true if userId is present and non-empty
     */
    public static boolean hasValidAuthInfo(HttpServletRequest request) {
        // ✅ 只检查 userId 是否存在
        return Objects.nonNull(getUserId(request));
    }
}